package cn.edu.ecut.dao;

import cn.edu.ecut.entity.Student;
import com.mozicoding.foundation.support.EncryptHelper;
import com.mozicoding.foundation.support.EncryptType;
import com.mozicoding.jdbc.DatabaseType;
import com.mozicoding.jdbc.JdbcHelper;
import com.mozicoding.jdbc.RowMapper;


import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDate;

public class StudentDao {

    private static final String INSERT ;
    private static final String SINGLE ;

    static {
        INSERT = "INSERT INTO t_students ( login_name , password ) VALUES ( ? , ? )" ;
       SINGLE = "SELECT id , login_name , password , name , gender , date_of_birth FROM t_students WHERE login_name = ? ";
    }

    // 通过实现RowMapper接口完成将查询结果中的每个列的值设置到相应的Student对象中
    private RowMapper<Student> mapper = new RowMapper<Student>() { // 使用 匿名类 实现了RowMapper接口
        @Override
        public Student wrap(ResultSet rs) throws SQLException {
            Student s = new Student();// 创建Student对象

            int sid = rs.getInt( "id") ; // 从结果集对象(rs)的当前行获取 id 列的值
            s.setId( sid ); // 为Student对象设置id (将sid的值存储到Student实例的实例变量中)

            String loginName = rs.getString( "login_name" ); // 从结果集对象(rs)的当前行获取 login_name 列的值
            s.setLoginName( loginName );

            String password = rs.getString( "password" ); // 从结果集对象(rs)的当前行获取 password 列的值
            s.setPassword( password );

            String name = rs.getString( "name" ); // 从结果集对象(rs)的当前行获取 name 列的值
            s.setName( name );

            String genderString = rs.getString( "gender" ); // 从结果集对象(rs)的当前行获取 gender 列的值
            if( genderString != null && !genderString.trim().isEmpty() ){
                char gender = genderString.charAt( 1 ) ; // 从数据库中获取到的 gender 列的值中截取第一个字符
                s.setGender( gender );
            }

            java.sql.Date date = rs.getDate( "date_of_birth" );
            if( date != null ) {
                LocalDate birthdate = date.toLocalDate();
                s.setBirthdate( birthdate );
            }

            return s ; // 返回Student对象
        }
    };

    /**
     * 保存学生对象中的数据到数据库中
     * @param s 表示被保存的学生对象
     * @return 当保存成功时返回true
     */
    public boolean save( Student s ) {
        JdbcHelper h = JdbcHelper.getInstance( DatabaseType.MYSQL );
        String password = s.getPassword();
        // 对密码进行加密
        String encrypted = EncryptHelper.encrypt( password , EncryptType.SHA1 );
        // 向数据库插入的是加密后的密码
        int count = h.update( INSERT , s.getLoginName() , encrypted );
        h.release();
        return count > 0 ;
    }

    /**
     * 根据登录名称查询数据库并返回与数据库中指定记录对应的Student对象。
     * 在返回的 Student 对象中保存了来自数据库中指定记录的各个列的值。
     * @param loginName 被查询的登录名称(作为查询条件来使用)
     * @return 返回与数据库中指定记录对应的Student实例
     */
    public Student find( String loginName ) {
        JdbcHelper h = JdbcHelper.getInstance( DatabaseType.MYSQL );
        Student s = h.single( SINGLE , mapper , loginName );
        h.release();
        return s ;
    }

}
